#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#define QT_NO_KEYWORDS
#include <QMainWindow>
#include <QMap>
#include <QTime>
#include <genai/text/chat.h>
#include <coreai/speech/recognizer.h>    // 语音识别
#include <coreai/speech/synthesizer.h>   // 语音合成
#include <coreai/speech/audioconfig.h>   // 音频配置
#include <coreai/speech/config.h>        // 模型配置
#include <gio/gio.h>
#include "customroledialog.h"

#define AISDK_NO_ERROR 0

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    void on_sendButton_clicked();
    void on_startRecordButton_clicked();
    void on_stopRecordButton_clicked();
    void on_playVoiceButton_clicked();
    void on_settingsButton_clicked();
    void on_customRoleButton_clicked();
    void on_roleComboBox_currentIndexChanged(int index);

private:
    void initTextSession();
    void initSpeechSession(); // 新增：初始化语音识别和合成会话
    static void textCallback(ChatResult *result, void *user_data);
    static void asrCallback(SpeechRecognitionResult *result, void *user_data); // 语音识别回调
    static void ttsCallback(SpeechSynthesisResult *result, void *user_data);   // 语音合成回调
    void addCustomRole(const QString &roleName, const QString &prompt);
    QString markdownToHtml(const QString &markdown);
    void setUSBMicrophoneAsDefault();
    void checkAvailableMicrophones();

    Ui::MainWindow *ui;
    GenAiTextSession *textSession;
    ChatModelConfig *textConfig;
    SpeechRecognitionSession *asrSession;   // 语音识别会话
    SpeechSynthesizerSession *ttsSession;   // 语音合成会话
    SpeechModelConfig *speechModelConfig;   // 语音模型配置
    AudioConfig *asrAudioConfig;            // 语音识别音频配置
    AudioConfig *ttsAudioConfig;            // 语音合成音频配置
    GMainLoop *mainLoop;
    QMap<QString, QString> rolePrompts;     // 角色提示词映射
    QString replyBuffer;                    // AI 回复缓冲区
    QString contentBuffer;                  // 聊天内容缓冲区
    QString ttsOutputFile;                  // 语音合成输出文件路径
    bool isRecording;                       // 录音状态
};

#endif // MAINWINDOW_H
